
# 从qtpy库的QtWidgets模块导入所有组件
from qtpy.QtWidgets import *
# 从qtpy库导入QtCore和QtGui模块，其中QtCore后续未使用，可移除
from qtpy import QtCore, QtGui

# 从src.Input模块导入输入动作类型枚举类
from src.Input import InputActionType
# 从src.UI.Widgets模块导入键盘修饰键捕获组件类
from src.UI.Widgets.KeyboardModifiersCapture import KeyboardModifiersCaptureWidget
# 从src.UI.Widgets模块导入按键捕获组件类
from src.UI.Widgets.KeyCapture import KeyCaptureWidget
# 从src.UI.Widgets模块导入鼠标按钮捕获组件类
from src.UI.Widgets.MouseButtonCapture import MouseButtonCaptureWidget


class InputActionWidget(QWidget):
    """
    InputActionWidget类用于创建一个输入动作设置的界面组件。
    该组件可以让用户设置键盘修饰键、按键和鼠标按钮等输入动作。

    :param parent: 父控件，默认为None
    :param inputActionRef: 输入动作的引用对象，默认为None
    """

    def __init__(self, parent=None, inputActionRef=None):
        """
        初始化InputActionWidget组件。

        :param parent: 父控件，默认为None
        :param inputActionRef: 输入动作的引用对象，默认为None
        """
        # 调用父类QWidget的构造函数
        super(InputActionWidget, self).__init__(parent)
        # 保存当前输入动作的引用对象
        self.currentActionRef = inputActionRef
        # 创建一个水平布局并设置给当前组件
        self.layout = QHBoxLayout(self)
        # 设置布局的边距为0
        self.layout.setContentsMargins(0, 0, 0, 0)

        # 创建一个标签，用于显示键盘修饰键的图标
        modifiersLabel = QLabel()
        # 设置标签的大小策略，此处存在未解析特性引用问题
        modifiersLabel.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
        # 设置标签显示的图片
        modifiersLabel.setPixmap(QtGui.QPixmap(":/shift-32.png"))
        # 创建键盘修饰键捕获组件
        self.modifiersWidget = KeyboardModifiersCaptureWidget()
        # 连接组件的captured信号到updateActionModifiers方法，当捕获到修饰键时更新动作
        self.modifiersWidget.captured.connect(self.updateActionModifiers)
        # 将标签和组件添加到布局中
        self.layout.addWidget(modifiersLabel)
        self.layout.addWidget(self.modifiersWidget)

        # 如果当前输入动作类型是键盘类型
        if self.actionType == InputActionType.Keyboard:
            # 创建一个标签，用于显示键盘图标
            keyLabel = QLabel()
            # 设置标签的大小策略，此处存在未解析特性引用问题
            keyLabel.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
            # 设置标签显示的图片
            keyLabel.setPixmap(QtGui.QPixmap(":/keyboard-32.png"))
            # 创建按键捕获组件
            self.keyCapture = KeyCaptureWidget()
            # 连接组件的captured信号到updateActionKey方法，当捕获到按键时更新动作
            self.keyCapture.captured.connect(self.updateActionKey)
            # 将标签和组件添加到布局中
            self.layout.addWidget(keyLabel)
            self.layout.addWidget(self.keyCapture)

        # 如果当前输入动作类型是鼠标类型
        if self.actionType == InputActionType.Mouse:
            # 创建一个标签，用于显示鼠标提示信息和图标
            mouseLabel = QLabel("Mouse:")
            # 设置标签的大小策略，此处存在未解析特性引用问题
            mouseLabel.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
            # 设置标签显示的图片
            mouseLabel.setPixmap(QtGui.QPixmap(":/mouse-32.png"))
            # 创建鼠标按钮捕获组件
            self.mouseCapture = MouseButtonCaptureWidget()
            # 连接组件的captured信号到updateActionMouse方法，当捕获到鼠标按钮时更新动作
            self.mouseCapture.captured.connect(self.updateActionMouse)
            # 将标签和组件添加到布局中
            self.layout.addWidget(mouseLabel)
            self.layout.addWidget(self.mouseCapture)

    def updateActionMouse(self, value):
        """
        更新当前输入动作的鼠标按钮设置。

        :param value: 新的鼠标按钮值
        """
        if self.currentActionRef is not None:
            # 调用当前输入动作引用对象的设置鼠标按钮方法
            self.currentActionRef.setMouseButton(value)

    def updateActionKey(self, value):
        """
        更新当前输入动作的按键设置。

        :param value: 新的按键值
        """
        if self.currentActionRef is not None:
            # 调用当前输入动作引用对象的设置按键方法
            self.currentActionRef.setKey(value)

    def updateActionModifiers(self, value):
        """
        更新当前输入动作的键盘修饰键设置。

        :param value: 新的键盘修饰键值
        """
        if self.currentActionRef is not None:
            # 调用当前输入动作引用对象的设置修饰键方法
            self.currentActionRef.setModifiers(value)

    def setAction(self, inputAction):
        """
        设置当前输入动作的信息。

        :param inputAction: 输入动作对象
        """
        # 设置键盘修饰键捕获组件的当前修饰键值
        self.modifiersWidget.currentModifiers = inputAction.getModifiers()
        try:
            # 尝试设置按键捕获组件的当前按键值
            self.keyCapture.currentKey = inputAction.getKey()
        except:
            # 若出现异常则忽略
            pass

        try:
            # 尝试设置鼠标按钮捕获组件的当前鼠标按钮值
            self.mouseCapture.currentButton = inputAction.getMouseButton()
        except:
            # 若出现异常则忽略
            pass

    def getModifiers(self):
        """
        获取当前设置的键盘修饰键值。

        :return: 当前设置的键盘修饰键值
        """
        return self.modifiersWidget.currentModifiers

    def getKey(self):
        """
        获取当前设置的按键值。

        :return: 当前设置的按键值，若获取失败则返回None
        """
        try:
            return self.keyCapture.currentKey
        except:
            return None

    def getMouseButton(self):
        """
        获取当前设置的鼠标按钮值。

        :return: 当前设置的鼠标按钮值，若获取失败则返回None
        """
        try:
            return self.mouseCapture.currentButton
        except:
            return None

    @property
    def actionType(self):
        """
        获取当前输入动作的类型。

        :return: 当前输入动作的类型
        """
        return self.currentActionRef.actionType